//#include <iostream>
//#include <string>
//using namespace std;
//
//int T;
//
//int main()
//{
//	cin >> T;
//	while (T--)
//	{
//		string s;
//		cin >> s;
//		long ret = 0;
//		long len = s.size();
//		int mmin = 100;
//		for (int i = 0; i < len; i++)
//		{
//			int a = s[i] - '0';
//			ret += a;
//			mmin = min(a, mmin);
//		}
//
//		if (mmin == 0)
//		{
//			cout << ret + 9 << endl;
//		}
//		else
//		{
//			cout << ret + 8 << endl;
//		}
//
//	}
//	return 0;
//}


//#include <iostream>
//using namespace std;
//
//const int N = 110;
//
//int f[N] = { 0 };
//
//int n, m;
//
//int main()
//{
//	cin >> n >> m;
//	for (int i = 1; i <= m; i++)
//	{
//		int l;
//		int r;
//		cin >> l >> r;
//		f[l]++;
//		f[r + 1]--;
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		f[i] = f[i - 1] + f[i];
//		if (f[i] != 1)
//		{
//			cout << i << " " << f[i] << endl;
//			return 0;
//		}
//	}
//
//	cout << "OK" << endl;
//
//	return 0;
//}


//#include <iostream>
//using namespace std;
//
//int dx[] = { 0, 1, 0, -1 };
//int dy[] = { 1, 0, -1, 0 };
//
//int m, x, y;
//
//int dfs(int n, int begin, int i, int j)
//{
//	if (i == 1)
//		return begin + j;
//	else if (j == n)
//		return begin + (n - 1) + i;
//	else if (i == n)
//		return begin + 2 * (n - 1) + (n - j + 1);
//	else if (j == 1)
//		return begin + 3 * (n - 1) + (n - i + 1);
//	else
//		return dfs(n - 2, begin + 4 * (n - 1), i - 1, j - 1);
//}
//
//int main()
//{
//	cin >> m >> x >> y;
//
//	cout << dfs(m, 0, x, y) << endl;
//
//	return 0;
//}


//#include <iostream>
//#include <algorithm>
//using namespace std;
//
//typedef long long ll;
//
//const int N = 1e3 + 10;
//const int M = 5e4 + 10;
//
//int fa[N] = { 0 };
//
//int n, m;
//
//int pos = 0;
//struct node
//{
//	ll a;
//	ll b;
//	ll w;
//}e[2 * M];
//
//bool cmp(node& x, node& y)
//{
//	return x.w > y.w;
//}
//
//int find(int x)
//{
//	return x == fa[x] ? x : find(fa[x]);
//}
//
//int kk()
//{
//	ll ret = 0;
//	ll cnt = 0;
//	sort(e + 1, e + 1 + pos, cmp);
//	for (int i = 1; i <= n; i++)
//	{
//		fa[i] = i;
//	}
//	for (int i = 1; i <= pos; i++)
//	{
//		ll x = e[i].a;
//		ll y = e[i].b;
//		ll z = e[i].w;
//
//		int fx = find(x);
//		int fy = find(y);
//		if (fx != fy)
//		{
//			cnt++;
//			ret += z;
//			fa[fx] = fy;
//		}
//	}
//
//	if (cnt == n - 1)
//		return ret;
//	else
//		return -1;
//}
//
//int main()
//{
//	cin >> n >> m;
//	
//	for (int i = 1; i <= m; i++)
//	{
//		int x, y, z;
//		cin >> x >> y >> z;
//		++pos;
//		e[pos].a = x;
//		e[pos].b = y;
//		e[pos].w = z;
//	}
//
//	cout << kk() << endl;
//
//	return 0;
//}



#include <iostream>
#include <vector>
#include <queue>
using namespace std;

const int N = 1510;

vector<pair<int, int>> edges[N];
int dist[N] = { 0 };
bool st[N] = { 0 };

int n, m;

void spfa()
{
	memset(dist, 0x3f3f3f3f, sizeof(dist));
	dist[1] = 0;

	queue<int> q;
	st[1] = 1;
	q.push(1);
	while (q.size())
	{
		int t = q.front();
		q.pop();
		st[t] = 0;
		for (auto ch : edges[t])
		{
			int b = ch.first;
			int w = ch.second;
			if (dist[b] > dist[t] + w)
			{
				dist[b] = dist[t] + w;
				if (st[b] == 0)
				{
					q.push(b);
					st[b] = 1;
				}
			}
		}
	}
}

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= m; i++)
	{
		int u, v, w;
		cin >> u >> v >> w;
		edges[u].push_back({ v, -1 * w });
	}

	spfa();

	if (dist[n] == 0x3f3f3f3f)
		cout << -1 << endl;
	else
		cout << -1 * dist[n] << endl;

	return 0;
}

